package shg.book.control
{
	import com.view.PreviewBook;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.errors.EOFError;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.geom.Rectangle;
	import flash.utils.ByteArray;
	
	import mx.collections.ArrayCollection;

	/**
	 * 这类是当作者在编辑的时候点击预览按钮的时候出现当前作者所编辑并且保存的
	 * 所有页面，同时作者可以选择某一页进行修改，
	 * */
	public class PreviewBookAtion
	{
		//表示图片大小和索引的数组
		 public var img_size_index:ArrayCollection;
		//表示图片的序号的索引，和img标签的ID有关
		 public var img_sequence:ArrayCollection;
		//表示每一页HTML的大小和索引
		 private var html_size_index:ArrayCollection;
		//从来存储所有的img
		 public var _img:ByteArray;
		 //HTML的字节数组
		 private var _html:ByteArray;
		 //每一页的HTML
		 private var pages:ArrayCollection;
		 //textFlow标签
		 private var textFlow_label:XML;
		 private var newxml:XML;
		 //这个字节数组存储的密钥信息和书籍封面的数据
		 private var other_msg:ByteArray;
		 //密钥和封面图片信息的长度
		 private var other_msg_length:Number=0;
		 //暂时存储图片的路径
		 private var img_path:String;
		 
		 
		public function PreviewBookAtion()
		{
		}
		/**
		 * 这里读取到的是文件里面的HTML的
		 * */
		public  function readFile(filePath:String):ArrayCollection{
			var file:File=new File(filePath);
			var fileStream:FileStream=new FileStream();
			var array:Array;
			var imgSize:Number=0;
			var htmlSize:Number=0;
			var array_length:Number=0;
			var xml:XML;
			if(file.exists){
				fileStream.open(file,FileMode.READ);
				var isread:Number=fileStream.bytesAvailable;
				if(isread>0){
					try{
						//临时变量
						var temporary_variable:ByteArray=new ByteArray();
						//这次单位读取得到就是最后面30个指定长度的表示各个数组的字符串 
						fileStream.position=isread-30;
						fileStream.readBytes(temporary_variable);
						
						var _imgLength:Number = Number(temporary_variable.readMultiByte(10,"UTF-8"));
						var _sequeseLength:Number = Number(temporary_variable.readMultiByte(10,"UTF-8"));
						var _htmlLength:Number = Number(temporary_variable.readMultiByte(10,"UTF-8"));
						//这次重新地位读取的是三个数组，分别是
						array_length=_imgLength+_sequeseLength+_htmlLength+30;
						fileStream.position=isread-(array_length);
						//循环利用这个字节数组，再次使用前需要清空
						temporary_variable.clear();
						fileStream.readBytes(temporary_variable);
						var img_str:String=temporary_variable.readMultiByte(_imgLength,"UTF-8");
						var sequese_str:String=temporary_variable.readMultiByte(_sequeseLength,"UTF-8");
						var html_str:String=temporary_variable.readMultiByte(_htmlLength,"UTF-8");
						//计算出所有图片的大小
						array=img_str.split("&");
						img_size_index=new ArrayCollection(array);
						for(var i:uint=0;i<img_size_index.length;i++){
							imgSize+=Number(String(img_size_index[i]).split("-")[0]);
						}
						//计算出所有HTML的大小
						html_size_index=new ArrayCollection();
						for(var h:uint=0;h<html_str.split("_").length;h++){
							html_size_index.addItem(html_str.split("_")[h]);
							htmlSize+=Number(html_str.split("_")[h]);
						}
						//获取IMG的id也就是sequence
						img_sequence=new ArrayCollection();
						for(var s:uint=0;s<sequese_str.split("&").length;s++){
							img_sequence.addItem(sequese_str.split("&")[s]);
						}
						
						//读取IMG
						fileStream.position=0;
						_img=new ByteArray();
						fileStream.readBytes(_img,0,imgSize);
						
						//创建文件夹，原来临时保存图片文件，当应用程序加载完成最后就删除此文件夹
						var bookImgPath:File=File.applicationStorageDirectory.resolvePath("Book ImgPath");
						//如果已经存在这个文件夹就首先把他删除
						if(bookImgPath.exists)
							bookImgPath.deleteDirectory(true);
						//创建新的文件夹
						bookImgPath.createDirectory();
						img_path=bookImgPath.nativePath;
						if(img_sequence!=null){
							var fileImg:File=null;
							var index:Number=0;
							var img_size:Number=0;
							var fileString:FileStream=new FileStream();
							_img.position=0;
							for(var id:uint=0;id<img_sequence.length;id++){
								var byte:ByteArray=new ByteArray();
								var path:String=img_sequence[id];
								fileImg=new File(bookImgPath.nativePath+"\\"+path+".png");
								fileString.open(fileImg,FileMode.WRITE);
								index=Number(path.split("_")[1]);
								//因为我们从1开始设置index，而实际搜索数组的索引是从0开始,获取当前这张图片的大小
								img_size=Number(String(img_size_index[index-1]).split("-")[0]);
								_img.readBytes(byte,0,img_size);
								var bitmap:Bitmap=new Bitmap();
								fileString.writeBytes(byte);
								fileString.close();
							}
						}
						
						
						//读取密钥
						//计算出密钥和封面的长度，分别是  总长度-所有图片长度-所有HTML长度-表示数组的长度
						other_msg_length=isread-(imgSize+htmlSize+array_length);
						if(other_msg_length>0){
							other_msg=new ByteArray()
							fileStream.readBytes(other_msg,0,other_msg_length);
						}
						//读取HTML
						_html=new ByteArray();
						pages=new ArrayCollection();
						fileStream.readBytes(_html,0,htmlSize);
						for(var ph:uint=0;ph<html_size_index.length;ph++){
							var page_html:String=_html.readMultiByte(Number(html_size_index[ph]),"UTF-8");
							xml=updateSource(page_html);
							var textFlow:XML=textFlow_label.appendChild(xml.children());
							pages.addItem(textFlow);
						}
						//确保是双数，因为没2页组成一张
						if((html_size_index.length%2) != 0){
							var xmlLast:XML=<TextFlow whiteSpaceCollapse="preserve" xmlns="http://ns.adobe.com/textLayout/2008">
															  <p textAlign="center">
															  </p>
														</TextFlow>;
							pages.addItem(xmlLast);
						}
						return pages;
						
					}catch(error:EOFError){
						trace("读取数据出错"+error.toString());
					}
				}else{
					trace("文件里面没有可读数据");
				}
			}else{
				trace("文件不存在");
			}
			//关闭文件释放资源
			fileStream.close();
			return null;
		}
		//当作者是保存的话就需要清空编辑器并将数据保存到数组里面
		private   function updateSource(str:String):XML{
			//总长度
			var length:Number=str.length;
			//下面的目的只有一个就是把 <TextFlow></TextFlow>标签删除，因为它带有命名空间，下面采用的E4X无法操作这个带命名空间的XML
			var first:Number=str.indexOf(">",0);
			var last:Number=str.lastIndexOf("<",length);
			var list:XMLList=new XMLList(str.slice(first+1,length-(length-last)));
			//把textFlow保存在一个临时变量
			textFlow_label=new XML(str.slice(0,first+1)+str.slice(last,length));
			
			newxml=new XML(<order></order>);
			newxml.appendChild(list);
			
			return findSource(newxml.children());
		}
		//通过imf的ID寻找其值
		private function findSource(list:XMLList):XML{
			var imgLength:Number=list.img.length();
			//先判断其是否存在子节点,如果存在子节点当前节点是否存在img
			if(list.length()>0){
				if(imgLength>0){
					for(var i:Number=0;i<imgLength;i++){
						list.img[i].@source=img_path+"\\"+list.img[i].@id+".png";
					}
				}
			}
			//如果还存在子节点就递归调用
			if(list.children().length()>0){
				findSource(list.children());
			}
			return newxml;
		}
	}
}